package com.yuandian.management.service.impl;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.yuandian.api.management.entity.ConfMpResource;
import com.yuandian.api.management.po.ConfMpResourceParams;
import com.yuandian.bpm.common.core.util.R;
import com.yuandian.management.mapper.ConfMpResourceMapper;
import com.yuandian.management.service.ConfMpResourceService;
import com.yuandian.utils.CodeUtil;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

/**
 * 中台监控-服务资源配置表-Service实现
 * @author zfsn
 * @date 2023-4-18
 */
@Service
public class ConfMpResourceServiceImpl extends ServiceImpl<ConfMpResourceMapper, ConfMpResource>
		implements ConfMpResourceService {

	/**
	 * 根据资源编码获取一条资源配置数据
	 * @param resourceCode 资源编码
	 * @return 资源配置实体
	 */
	private ConfMpResource getByResourceCode(String resourceCode) {
		return lambdaQuery().eq(ConfMpResource::getResourceCode, resourceCode).one();
	}

	/**
	 * 分页查询
	 * @param params 中台监控-服务资源配置请求参数
	 * @return 通用返回对象
	 */
	@Override
	public R<Page<ConfMpResource>> page(ConfMpResourceParams params) {
		Page<ConfMpResource> page = Page.of(params.getCurrent(), params.getSize());
		page.addOrder(params.orders()).orders().forEach(orderItem -> orderItem.setColumn(StrUtil.toUnderlineCase(orderItem.getColumn())));
		return R.ok(lambdaQuery()
				.in(CollUtil.isNotEmpty(params.getServiceIdList()), ConfMpResource::getServiceId, params.getServiceIdList())
				.eq(params.getResourceType() != null, ConfMpResource::getResourceType, params.getResourceType())
				.like(StrUtil.isNotEmpty(params.getUrl()), ConfMpResource::getUrl, params.getUrl())
				.page(page));
	}

	/**
	 * 新增数据
	 * @param params 中台监控-服务资源配置请求参数
	 * @return 通用返回对象
	 */
	@Transactional(rollbackFor = Exception.class)
	@Override
	public R<Boolean> saveWrap(ConfMpResourceParams params) {
		ConfMpResource confMpResource = BeanUtil.copyProperties(params, ConfMpResource.class);
		// 打编码  资源编码由前端传值，无需在后端生成
		//confMpResource.setResourceCode(CodeUtil.md5(confMpResource.getUrl()));
		//if (ObjectUtil.isNotNull(getByResourceCode(confMpResource.getResourceCode()))) {
		//	return R.failed("新增失败，已存在相同的资源编码！");
		//}
		save(confMpResource);
		return R.ok(Boolean.TRUE, "新增成功");
	}

	/**
	 * 通过主键更新数据
	 * @param params 中台监控-服务资源配置请求参数
	 * @return 通用返回对象
	 */
	@Transactional(rollbackFor = Exception.class)
	@Override
	public R<Boolean> updateByIdWrap(ConfMpResourceParams params) {
		// 1、校验请求参数
		Integer resourceId = params.getId();
		if (resourceId == null) {
			return R.failed("更新失败，资源id不能为空！");
		}
		// 2、通过id获取资源配置
		ConfMpResource resourceById = getById(resourceId);
		// 3、校验该配置是否存在
		if (ObjectUtil.isNull(resourceById)) {
			return R.failed("更新失败，不存在该资源配置！");
		}
		// 4、校验资源编码的唯一性
		//String resourceCode = CodeUtil.md5(params.getUrl());
		//params.setResourceCode(resourceCode);
		//ConfMpResource resourceByCode = getByResourceCode(resourceCode);
		//if (ObjectUtil.isNotNull(resourceByCode) && !resourceId.equals(resourceByCode.getId())) {
		//	return R.failed("更新失败，已存在相同的资源！");
		//}
		// 5、更新资源配置
		BeanUtil.copyProperties(params, resourceById);
		updateById(resourceById);
		return R.ok(Boolean.TRUE, "更新成功");
	}

	/**
	 * 根据服务id集合删除服务下的所有资源配置
	 * @param serviceIdList 服务id集合
	 * @return 通用返回对象
	 */
	@Transactional(rollbackFor = Exception.class)
	@Override
	public R<Boolean> removeByServiceIds(List<Integer> serviceIdList) {
		return R.ok(lambdaUpdate().in(CollUtil.isNotEmpty(serviceIdList), ConfMpResource::getServiceId, serviceIdList).remove());
	}
}